Hogyan ellenőrizzem azt, hogy a régi jelszó megfelel-e az adatbázisban lévővel, sha512-vel?
Hali, nem nagyon tudom, hogy mi a gond, hiába próbálkozom, nem tudok rájönni.
a db_password az megfelelő, kiírja, azonban azt szeretném, hogyha a regisztrációnál használt jelszót írom be, akkor a db_password egyenlő legyen az oldpw-vel. Teszteltem, hogy kiírom echoval a kapott dolgokat, és akkor arra jöttem rá, hogy a db_password az megfelel, azonban az oldpw nem azt írja, amit szeretnék.
Kód:
if($_POST['editbutton']) {
$oldpw = stripslashes($mysqli->real_escape_string($_POST['oldpw']));
$newpw = stripslashes($mysqli->real_escape_string($_POST['newpw']));
$newpw = hash('sha512', $password);
$newpwconfirm = stripslashes($mysqli->real_escape_string($_POST['newpwconfirm']));
if ($stmt = $mysqli->prepare("SELECT password, salt FROM members WHERE email = ? LIMIT 1")) {
$stmt->bind_param('s', $email); // Bind "$email" to parameter.
$stmt->execute(); // Execute the prepared query.
$stmt->store_result();
// get variables from result.
$stmt->bind_result($db_password, $salt);
$stmt->fetch();
$oldpw_check = hash('sha512', $oldpw . $salt);
echo "$oldpw_check <br /> <br /> $db_password";
if ($db_password == $oldpw_check) {
$mysqli->query("UPDATE $table SET password = '$newpw' WHERE username = '$username]'");
echo 'Sikeres';
}
else {
echo 'Sikertelen';
}
}
}
echo " <h1>Szerkesztés</h1>";
echo '
<dl>
<form method="post" name="edit_form" id="third">
<label for="email"><strong><span class="blue">*</span>Régi jelszó:</strong></label>
<input name="oldpw" id="oldpw" type="password" size="20" />
<label for="subject"><strong><span class="blue">*</span>Új Jelszó:</strong></label>
<input type="password" name="newpw" id="password" size="20" />
<label for="subject"><strong><span class="blue">*</span>Új Jelszó ismétlése:</strong></label>
<input type="password" name="newpwconfirm" id="password" size="20" />
<br /><br />
<input type="submit" class="buttonSubmit" value="Ment" name="editbutton" onclick="editformhash(this.form, this.form.epw);" /><br />
</form>
</dl>';
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
$newpw = hash('sha512', $password);
$oldpw_check = hash('sha512', $oldpw . $salt);
szerintem regeléskor nem sóztad be (meg itt sem, jelszóváltáskor), viszont ellenőrzéskor sózottan hasonlítod össze.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Regisztráció kódja itt van, és van benne salt, amikor is betölti az adatbázisba, tehát ezért nem nagyon értem:
// Create a random salt
$random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE));
// Create salted password
$password = hash('sha512', $password . $random_salt);
$IP = $_SERVER['REMOTE_ADDR'];
// Insert the new user into the database
if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt, REGDATE, BANNED, PERM, Tarsitas, Acode, IP, Activated) VALUES (?, ?, ?, ?, '$time',0,0,0,0,'$IP',0)")) {
$insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt);
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
új regisztrációval próbálkozol? ha nem, és a régivel próbálod, akkor elsőre ugye lefut a jelszóváltás, mert a $db_pass egyezik az $olpw_check-el, viszont salt nélküli kerül be db-be, ezek után már sosem fog egyezni.
ha mégsem ez a gond, akkor egyelőre nincs ötletem.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
igen, tudom mi lenne ez, de azt mondom, hogy elsőre pedig lefut, és onnantól kezdve soha nem lesz jó.
Gondold végig:
Regisztrál, adatbázisba került a saltot használó jelszó, és a salt.
Meg akarja változtatni, az adatbázisból kiolvassa a (saltos) jelszót, és a saltot.
A megadott régi jelszót salttal együtt elkódolja
$oldpw_check = hash('sha512', $oldpw . $salt);
és ezt ellenőrzi az adatbázisban lévővel. if ($db_password == $oldpw_check)
Egyezik.
Elmenti az új jelszót, aminél nem sózod be -> $newpw = hash('sha512', $password);
Innentől kezdve az adatbázisban a salt nélküli van eltárolva.
Megint megváltoztatnád a jelszót: a db-ben levő (már) salt nélkülit az $oldpw_check-el, ami pedig használja a saltot. Soha többé nem fog egyezni.
Hogyan javíthatod ki?
Ha még nem tetted, akkor az új pw-hez is használd a saltot:
$newpw = hash('sha512', $password . $salt);
De így még adatbázisban a korrupt jelszavak vannak. Ezeket mondjuk kitörlöd, és csak új regisztrációkkal foglalkozol.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
nézd meg, hogy a regnél generált random salt egyezik-e azzal ami bekerült adatbázisba (nem-e vágja le)
(stripslashes($mysqli->real_escape_string(..))
szerintem ez így semmit nem csinál, escapeli a spec karaktereket, majd kiszedi az escapet.)
Leváltottam most a sha512t sha1-re, és átírtam a random saltot, de ez sem egyezik, és ez jóval kisebb, tehát kifér: Reginél és jelszóváltásnál is ugyanazt a random saltot írtam most be.
$random_salt = uniqid(mt_rand(), true);
$newpw = sha1($random_salt.$password);
$newpwconfrim = sha1($random_salt.$newpwconfirm);
// hash the password with the unique salt.
$password = sha1($salt.$password);
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!